package com.atguigu.tingshu.album.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.album.mapper.*;
import com.atguigu.tingshu.album.service.BaseCategoryService;
import com.atguigu.tingshu.model.album.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@SuppressWarnings({"all"})
public class BaseCategoryServiceImpl extends ServiceImpl<BaseCategory1Mapper, BaseCategory1> implements BaseCategoryService {

    @Autowired
    private BaseCategory1Mapper baseCategory1Mapper;

    @Autowired
    private BaseCategory2Mapper baseCategory2Mapper;

    @Autowired
    private BaseCategory3Mapper baseCategory3Mapper;


    @Autowired
    private BaseCategoryViewMapper baseCategoryViewMapper;

    @Autowired
    private BaseAttributeMapper baseAttributeMapper;

    @Override
    public JSONObject getBaseCategoryList(Long category1Id) {
        //	创建一个一级分类对象
        JSONObject category1 = new JSONObject();
        category1.put("categoryId",category1Id);
        //	一级分类表： base_category_view.id = category3_id
        List<BaseCategoryView> baseCategoryViewList = baseCategoryViewMapper.selectList(new LambdaQueryWrapper<BaseCategoryView>().eq(BaseCategoryView::getCategory1Id, category1Id));
        //		String category1Name = baseCategory1Mapper.selectById(category1Id).getName();
        category1.put("categoryName",baseCategoryViewList.get(0).getCategory1Name());
        //	获取二级分类数据：
        Map<Long, List<BaseCategoryView>> category2Map = baseCategoryViewList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
        Iterator<Map.Entry<Long, List<BaseCategoryView>>> iterator = category2Map.entrySet().iterator();
        //	创建集合列表;
        ArrayList<JSONObject> categoryChild2List = new ArrayList<>();
        while (iterator.hasNext()){
            Map.Entry<Long, List<BaseCategoryView>> entry = iterator.next();
            Long category2Id = entry.getKey();
            List<BaseCategoryView> categoryViewList = entry.getValue();
            //	创建一个一级分类对象
            JSONObject category2 = new JSONObject();
            category2.put("categoryId",category2Id);
            category2.put("categoryName",categoryViewList.get(0).getCategory2Name());
            //	获取三级分类数据
            List<JSONObject> list = categoryViewList.stream().map(categoryView -> {
                JSONObject category3 = new JSONObject();
                category3.put("categoryId", categoryView.getCategory3Id());
                category3.put("categoryName", categoryView.getCategory3Name());
                return category3;
            }).collect(Collectors.toList());
            //	将三级分类对象数据添加到二级分类集合中。
            category2.put("categoryChild",list);
            categoryChild2List.add(category2);
        }
        category1.put("categoryChild",categoryChild2List);
        //	返回数据
        return category1;
    }

    /**
     * 根据一级分类Id查询三级分类数据
     *
     * @param category1Id
     * @return
     */
    @Override
    public List<BaseCategory3> findTopBaseCategory3(Long category1Id) {
        //	根据一级分类Id 查询is_top=1 置顶分类数据;
        //  List<BaseCategory2> baseCategory2List = baseCategory2Mapper.selectList(new LambdaQueryWrapper<BaseCategory2>().eq(BaseCategory2::getCategory1Id, category1Id).select(BaseCategory2::getId));
        List<Long> category2IdList = baseCategory2Mapper.selectList(new LambdaQueryWrapper<BaseCategory2>().eq(BaseCategory2::getCategory1Id, category1Id)).stream().map(BaseCategory2::getId).collect(Collectors.toList());
        //	根据二级分类Id 查询三级分类数据;
        List<BaseCategory3> baseCategory3List = baseCategory3Mapper.selectList(new LambdaQueryWrapper<BaseCategory3>().in(BaseCategory3::getCategory2Id, category2IdList).eq(BaseCategory3::getIsTop, 1).last(" limit 7 "));
        //  返回数据
        return baseCategory3List;

    }


    @Override
    public List<BaseAttribute> findAttribute(Long category1Id) {
        //调用mapper层方法
        //	UserMapper userMapper = sqlsession.getMapper(UserMapper)  userMapper.getAll();
        return baseAttributeMapper.selectAttribute(category1Id);
    }

    /**
     * 根据分类id获取分类数据
     *
     * @param category3Id
     * @return
     */
    @Override
    public BaseCategoryView getCategoryView(Long category3Id) {
        return baseCategoryViewMapper.selectById(category3Id);

    }

    /**
     * 获取基础分类列表
     * <p>
     * 此方法用于从数据库中获取基础分类信息，并将其组织成一个JSON对象列表每个分类对象包含层级结构，
     * 分类信息包括一级分类、二级分类和三级分类，并包括每个层级的分类ID和名称
     *
     * @return List<JSONObject> 返回一个包含分类信息的JSON对象列表
     */
    @Override
    public List<JSONObject> getBaseCategoryList() {
        // 初始化返回结果列表. 创建一个空的JSON对象列表，用于存储最终的分类信息
        List<JSONObject> list = new ArrayList<>();

        // 从数据库中获取所有分类数据; select * from base_category_view where is_delete = 0;   没有条件所以是null
        List<BaseCategoryView> baseCategoryViewList = baseCategoryViewMapper.selectList(null);

        // 设置一个map 集合,将分类视图对象列表按一级分类ID分组    key=category1Id value=List<BaseCategoryView>   groupingBy分组
        Map<Long, List<BaseCategoryView>> categoryMap = baseCategoryViewList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));

        // 遍历一级分类分组后的Map
        Iterator<Map.Entry<Long, List<BaseCategoryView>>> iterator = categoryMap.entrySet().iterator();
        while (iterator.hasNext()){
            // 获取当前一级分类的ID和名称
            Map.Entry<Long, List<BaseCategoryView>> entry = iterator.next();
            Long category1Id = entry.getKey();
            String category1Name = entry.getValue().get(0).getCategory1Name();

            // 创建一级分类的JSON对象
            JSONObject category1 = new JSONObject();
            category1.put("categoryId",category1Id);
            category1.put("categoryName",category1Name);

            // 获取二级分类数据; 以二级分类Id 当做key 进行分组； key = category2Id value=List<BaseCategoryView>
            Map<Long, List<BaseCategoryView>> category2Map = entry.getValue().stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
            // 遍历二级分类分组后的Map
            Iterator<Map.Entry<Long, List<BaseCategoryView>>> iterator1 = category2Map.entrySet().iterator();
            // 创建一个集合
            ArrayList<JSONObject> category2Child = new ArrayList<>();
            while (iterator1.hasNext()){
                // 获取当前二级分类的ID和名称
                Map.Entry<Long, List<BaseCategoryView>> entry1 = iterator1.next();
                Long category2Id = entry1.getKey();
                String category2Name = entry1.getValue().get(0).getCategory2Name();

                // 创建二级分类的JSON对象
                JSONObject category2 = new JSONObject();
                category2.put("categoryId",category2Id);
                category2.put("categoryName",category2Name);
// TODO: 2025/2/17 方法一：
    /*           获取到三级分类集合; 循环遍历二级分类value 中的数据，将三级分类Id，name添加到一个集合中！
                 创建一个集合
                 ArrayList<JSONObject> category3Child = new ArrayList<>();
                 for (BaseCategoryView baseCategoryView : entry1.getValue()) {
                     Long category3Id = baseCategoryView.getCategory3Id();
                     String category3Name = baseCategoryView.getCategory3Name();
                     // 创建三级分类对象
                     JSONObject category3 = new JSONObject();
                     category3.put("categoryId",category3Id);
                     category3.put("categoryName",category3Name);
                     category3Child.add(category3);
                 }*/
// TODO: 2025/2/18 方法二：
                // map 做映射处理！ 循环遍历集合数据，并取出数据再组成新的集合；那么就可以使用stream().map(); 复制小括号（一个参数括号可以省略），写死右箭头，落地大括号
                // 将当前二级分类下的视图对象列表转换为三级分类的JSON对象列表         变量baseCategoryView：代表的是集合泛型
                List<JSONObject> category3Child = entry1.getValue().stream().map(baseCategoryView -> {
                    // 创建三级分类对象
                    JSONObject category3 = new JSONObject();
                    category3.put("categoryId", baseCategoryView.getCategory3Id());
                    category3.put("categoryName", baseCategoryView.getCategory3Name());
                    // 返回数据
                    return category3;
                }).collect(Collectors.toList());

                // 将三级分类的JSON对象列表添加到二级分类的JSON对象中
                category2.put("categoryChild",category3Child);
                category2Child.add(category2);
            }

            // 将二级分类的JSON对象列表添加到一级分类的JSON对象中
            category1.put("categoryChild",category2Child);
            list.add(category1);
        }

        // 返回包含所有分类信息的JSON对象列表
        return list;
    }

}

